package app.modules.infrastructure.profile.persistence.dao;

import app.modules.infrastructure.profile.dto.web.WebProfileItemDTO;
import app.modules.infrastructure.profile.dto.web.WebProfileItemQueryDTO;
import app.modules.infrastructure.profile.persistence.entity.ProfileItemEO;
import app.modules.infrastructure.profile.persistence.mapper.ProfileItemMapper;
import app.modules.infrastructure.profile.util.conversion.ProfileItemConvertUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jasmine.framework.common.util.CheckUtil;
import jasmine.framework.common.util.CollectionUtil;
import jasmine.framework.common.util.StringUtil;
import jasmine.framework.context.CurrentSubject;
import jasmine.framework.database.mybatisplus.dao.BaseI18nEntityDAO;
import jasmine.framework.database.mybatisplus.wrapper.LambdaQueryWrapperWithI18n;
import org.springframework.stereotype.Repository;

import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;

/**
 * @author mh.z
 */
@Repository
public class ProfileItemDAO extends BaseI18nEntityDAO<ProfileItemMapper, ProfileItemEO> {

    /**
     * 分页查询配置项
     *
     * @param query
     * @param adminFlag
     * @param page
     * @return
     */
    public List<WebProfileItemDTO> pageWebProfileItemDTOsByCond(WebProfileItemQueryDTO query,
                                                                boolean adminFlag, Page page) {
        CheckUtil.notNull(query, "query null");
        CheckUtil.notNull(page, "page null");
        LambdaQueryWrapperWithI18n<ProfileItemEO> wrapper = LambdaQueryWrapperWithI18n.wrapper();

        // 代码
        String itemCode = query.getItemCode();
        wrapper.like(StringUtil.isNotEmpty(itemCode), ProfileItemEO::getItemCode, itemCode);
        // 名称
        String itemName = query.getItemName();
        wrapper.likeWithI18n(StringUtil.isNotEmpty(itemName), ProfileItemEO::getItemName, itemName);
        // 描述
        String itemDesc = query.getItemDesc();
        wrapper.likeWithI18n(StringUtil.isNotEmpty(itemDesc), ProfileItemEO::getItemDesc, itemDesc);
        // 启用标志
        wrapper.eq(Boolean.TRUE.equals(query.getEnableFlagOnly()), ProfileItemEO::getEnableFlag, true);

        wrapper.and((nestedWrapper) -> {
            nestedWrapper.eq(ProfileItemEO::getTenantId, CurrentSubject.getTenantId());
            nestedWrapper.or().eq(ProfileItemEO::getAllowUserOverrideFlag, true);
            nestedWrapper.or().eq(adminFlag, ProfileItemEO::getAllowTenantOverrideFlag, true);
        });

        //
        wrapper.orderByAsc(ProfileItemEO::getItemCode);

        Page<ProfileItemEO> pageResult = baseMapper.selectPageWithI18n(page, wrapper);
        List<ProfileItemEO> recordList = pageResult.getRecords();
        List<WebProfileItemDTO> returnList = ProfileItemConvertUtil.profileItemEO2WebProfileItemDTO(recordList);

        return returnList;
    }

    /**
     * 根据配置项代码统计
     *
     * @param profileItemCode
     * @param excludeIds
     * @return
     */
    public long countByProfileItemCode(String profileItemCode, @Nullable Collection<Long> excludeIds) {
        LambdaQueryWrapper<ProfileItemEO> wrapper = Wrappers.lambdaQuery();

        wrapper.eq(ProfileItemEO::getItemCode, profileItemCode);
        wrapper.notIn(CollectionUtil.isNotEmpty(excludeIds), ProfileItemEO::getId, excludeIds);

        return baseMapper.selectCount(wrapper);
    }

}
